<?php
// +----------------------------------------------------------------------
// | Diygw PHP
// +----------------------------------------------------------------------
// | Copyright (c) 2022~2024 https://www.diygw.com All rights reserved.
// +----------------------------------------------------------------------
// | Author: diygw <diygwcom@diygw.com>
// +----------------------------------------------------------------------
declare (strict_types = 1);

namespace app\sell\model;

use diygw\model\DiygwModel;

/**
 * @package app\sell\model
 */
class OrdersModel extends DiygwModel
{
    // 表名
    public $name = 'sell_orders';

    // 相似查询字段
    protected $likeField=['customerTitle|products'];

    /*
     * 提交订单时加工产品数据增加入录记录明细
     */
    public function afterAdd(&$data){
        $products = $data['products'];
        //循环出仓明细数据
        foreach ($products as $product) {
            $id = $product['id'];
            //这里新增一个产品id来存放对应产品数据。
            $product['productId'] = $product['id'];
            //默认id是一个自增值
            unset($product['id']);
            $product['ordersId'] = $data['id'];
            //增加出库记录
            $productOutModel = new ProductOutModel();
            $productOutModel->add($product);
            //减少库存数量
            $productModel = new ProductModel();
            $productModel->decValue($id,'number',$product['number']);
        }
        return true;
    }

    public function afterEdit(&$data){
        //先取出上次入库的记录
        $productOutModel = new ProductOutModel();
        $productsOutDatas = $productOutModel->where('orders_id', $data['id'])->select()->toArray();

        $productsOutDatasMap  = [];
        foreach ($productsOutDatas as $productsOutData){
            $productsOutDatasMap[$productsOutData['productId']] = $productsOutData;
        }

        $products = $data['products'];
        // 提取数据库已存产品id
        $ids1 = array_column($productsOutDatas, 'productId');

        //获取新进来的产品id
        $ids2 = array_column($products, 'id');

        //比较修改的产品是否存在新增id
        $newIds = array_diff($ids2, $ids1);

        //比较修改的产品是否存在删除的产品Id
        $missingIds = array_diff($ids1, $ids2);

        //循环入仓明细数据
        foreach ($products as $product) {
            $id = $product['id'];
            //判断是新增进来的数据
            if(in_array($id,$newIds)){
                //这里新增一个产品id来存放对应产品数据。
                $product['productId'] = $id;
                //默认id是一个自增值
                unset($product['id']);
                $product['productsIn'] = $data['id'];
                //增加入库记录
                $productOutModel = new ProductOutModel();
                $productOutModel->add($product);
                //现有产品库存数量要减数
                $productModel = new ProductModel();
                $productModel->decValue($id,'number',$product['number']);
            }else if(isset($productsOutDatasMap[$id])&&$productsOutDatasMap[$id]['number']!=$product['number']){
                //判断原有的产品是否已入库且数量不等
                $productOutModel = new ProductOutModel();
                //修改变更产品的数量
                $productOutModel->where('product_id',$id)->update(['number'=>$product['number']]);
                //现有产品库存数量要增加
                $productModel = new ProductModel();
                //新的产品数量跟原有的产品数量做个比较
                $changeNumber = $product['number']-$productsOutDatasMap[$id]['number'];
                //如果数量大于0  产品库存数量是减少的
                if($changeNumber>0){
                    $productModel->decValue($id,'number',$changeNumber);
                }else{
                    $productModel->incValue($id,'number',$changeNumber);
                }
            }
        }

        //删除不存在的产品
        foreach ($missingIds as $id){
            $productOutModel = new ProductOutModel();
            //软删除不存在的产品
            $productOutModel->where('product_id',$id)->update(['delete_time'=>getCurrentDateTime()]);
            //现有产品库存数量要增加
            $productModel = new ProductModel();
            $productModel->incValue($id,'number',$productsOutDatasMap[$id]['number']);
        }
    }
    
    /**
     * 删除出仓记录时，产品数量要加回去
     * @param $data
     * @return bool
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function afterDel(&$data){
        //循环删除出仓单ID
        foreach ($data as $id){
            //获取对应出仓产品数据
            $productOutModel = new ProductOutModel();
            $productOutDatas = $productOutModel->where('orders_id',$id)->select()->toArray();
            foreach ($productOutDatas as  $productOutData){
                //修改具体产品，增加库存数量
                $productModel = new ProductModel();
                $productModel->incValue($productOutData['productId'],'number',$productOutData['number']);

                //删除出仓明细数据
                $productOutModel = new ProductOutModel();
                $productOutModel->where('id',$productOutData['id'])->update(['delete_time'=>getCurrentDateTime()]);
            }
        }
        return true;
    }
}
